/**
 * Copyright (c) 2017,http://www.365wuliu.com/  All Rights Reserved.
 */
package com.cargo.base.utils;

import com.thoughtworks.xstream.core.util.Base64Encoder;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;

/**
 * SecurityUtil:安全、加密类
 * 
 * @Project Name:topsales_services
 * @File Name:SecurityUtil.java
 * @Package Name:com.cargo.base.utils
 * @Creator:xukun
 * @Date:2017年9月14日下午1:20:11
 */
public class SecurityUtil {

	/**
	 * 
	 * Encrypt:数据加密算法
	 * 
	 * @param sSrc
	 * @param sKey
	 * @return
	 * @throws Exception
	 * @return :String
	 * @Creator:FEI SI QIANG
	 * @Date:2016年9月20日 上午9:55:47
	 */
	public static String Encrypt(String sSrc, String sKey) throws Exception {
		// key为空，直接返回
		if (sKey == null) {
			return null;
		}
		// 判断Key的长度是否为16位
		if (sKey.length() != 16) {
			return null;
		}
		// AES数据加密
		byte[] raw = sKey.getBytes("utf-8");
		SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
		Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");// "算法/模式/补码方式"
		cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
		byte[] encrypted = cipher.doFinal(sSrc.getBytes("utf-8"));
		// BASE64再次加密
		BASE64Encoder encoder = new BASE64Encoder();
		return encoder.encode(encrypted);
	}

	/**
	 * 
	 * Decrypt:数据解密算法
	 * 
	 * @param sSrc
	 * @param sKey
	 * @return
	 * @throws Exception
	 * @return :String
	 * @Creator:FEI SI QIANG
	 * @Date:2016年9月20日 上午10:08:31
	 */
	public static String Decrypt(String sSrc, String sKey) throws Exception {
		try {
			// key为空，直接返回
			if (sKey == null) {
				return null;
			}
			// 判断Key的长度是否为16位
			if (sKey.length() != 16) {
				return null;
			}
			// AES数据解密类初始化
			byte[] raw = sKey.getBytes("utf-8");
			SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
			Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
			cipher.init(Cipher.DECRYPT_MODE, skeySpec);

			// 优先使用BASE64对数据进行第一层解密
			BASE64Decoder decoder = new BASE64Decoder();
			byte[] encrypted = decoder.decodeBuffer(sSrc);
			try {
				// 对数据进行AES解密
				byte[] original = cipher.doFinal(encrypted);
				String originalString = new String(original, "utf-8");
				return originalString;
			} catch (Exception e) {
				System.out.println(e.toString());
				return null;
			}
		} catch (Exception ex) {
			System.out.println(ex.toString());
			return null;
		}
	}

	/**
	 * 
	 * getSecKey:获得秘钥加密
	 * 
	 * @param key
	 * @param licKey
	 * @return
	 * @throws Exception
	 * @return :String
	 * @Creator:FEI SI QIANG
	 * @Date:2016年9月20日 上午10:19:25
	 */
	public static String getSecKey(String key, String licKey) throws Exception {
		String secKey = "";
		secKey = Encrypt(key, licKey.substring(0, 16));

		return secKey;
	}

	/**
	 * 
	 * getLicKeyC:许可证秘钥用AES再加密
	 * 
	 * @param licKey
	 * @param secKey
	 * @return
	 * @throws Exception
	 * @return :String
	 * @Creator:FEI SI QIANG
	 * @Date:2016年9月20日 上午10:20:16
	 */
	public static String getLicKeyC(String licKey, String secKey) throws Exception {
		return SecurityUtil.Encrypt(licKey, secKey.substring(0, 16));
	}

	/**
	 * 
	 * getCKey:获得解密密钥
	 * 
	 * @param licKey
	 * @param secKey
	 * @return
	 * @throws Exception
	 * @return :String
	 * @Creator:FEI SI QIANG
	 * @Date:2016年9月20日 上午10:20:48
	 */
	public static String getCKey(String licKey, String secKey) throws Exception {
		String cKey = "";
		licKey = Decrypt(licKey, secKey.substring(0, 16));
		cKey = Decrypt(secKey, licKey.substring(0, 16));

		return cKey;
	}

	/**
	 * 
	 * padkey:补全秘钥为16位
	 * 
	 * @param keyString
	 * @return
	 * @return :String
	 * @Creator:FEI SI QIANG
	 * @Date:2016年9月20日 上午10:21:42
	 */
	public static String padkey(String keyString) {
		String returnCode = "";
		if (keyString.length() > 16) {
			returnCode = keyString.substring(0, 16);
		}
		if (keyString.length() == 16) {
			returnCode = keyString;
		}
		if (keyString.length() < 16) {
			int padLength = 16 - keyString.length();
			for (int i = 0; i < padLength; i++) {
				keyString += "0";
			}
			returnCode = keyString;
		}
		return returnCode;
	}

	/**
	 * 
	 * encode:加密
	 * 
	 * @param str
	 * @return String
	 * @Creator:ZHU CHEN
	 * @Date:2016年4月14日 下午2:28:53
	 */
	public static String encode(String str) {
		byte[] b = null;
		String s = null;
		try {
			b = str.getBytes("utf-8");
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		if (b != null) {
			s = new Base64Encoder().encode(b);
		}
		return s;
	}

	/**
	 * 
	 * decode:解密
	 * 
	 * @param s
	 * @return String
	 * @Creator:ZHU CHEN
	 * @Date:2016年4月14日 下午2:29:10
	 */
	public static String decode(String s) {
		byte[] b = null;
		String result = null;
		if (s != null) {
			Base64Encoder decoder = new Base64Encoder();
			try {
				b = decoder.decode(s);
				result = new String(b, "utf-8");
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return result;
	}

	/**
	 * toMD5:(MD5加密).
	 * 
	 * @param plainText
	 * @return
	 * @return :String
	 * @Creator:xukun
	 * @Date:2017年9月14日 下午1:25:19
	 */
	public static String toMD5(String plainText) {
		if (null == plainText) {
			plainText = "";
		}
		String MD5Str = "";
		try {
			// JDK 6 支持以下6种消息摘要算法，不区分大小写
			// md5,sha(sha-1),md2,sha-256,sha-384,sha-512
			MessageDigest md = MessageDigest.getInstance("MD5");
			md.update(plainText.getBytes("UTF-8"));
			byte b[] = md.digest();

			int i;

			StringBuilder builder = new StringBuilder(32);
			for (int offset = 0; offset < b.length; offset++) {
				i = b[offset];
				if (i < 0)
					i += 256;
				if (i < 16)
					builder.append("0");
				builder.append(Integer.toHexString(i));
			}
			MD5Str = builder.toString();
			// LogUtil.println("result: " + buf.toString());// 32位的加密
		} catch (Exception e) {
			e.printStackTrace();
		}
		return MD5Str;
	}

}
